home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 147 / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin / tools / pecls / wfd.c < prev    next >
C/C++ Source or Header  |  1999-10-06  |  3KB  |  139 lines

  1. /*
  2.  *    PECLS Operating System
  3.  *    (Parallel Execute Control Learning System)
  4.  *            Copyright (C) 1994,95,96,98,99 M.Suzuki
  5.  *
  6.  *    FD writer
  7.  *
  8.  */
  9.  
  10. /*
  11.  *
  12.  *    $Id: wfd.c,v 1.1 1999/08/27 19:30:17 suzuki Exp suzuki $
  13.  *
  14.  *    $Log: wfd.c,v $
  15.  *    Revision 1.1  1999/08/27 19:30:17  suzuki
  16.  *    Initial revision
  17.  *
  18.  *
  19.  */
  20.  
  21. #include <stdio.h>
  22. #include <ctype.h>
  23. #include <stdlib.h>
  24. #include <stat.h>
  25. #include <string.h>
  26. #include <iocslib.h>
  27.  
  28. #define    False    0
  29. #define    True    (!False)
  30.  
  31. #define    PR(x)    /* none    */
  32. #define    Null(x)    /* none    */
  33.  
  34. #define    SECTOR_SIZE    3        /* 0,128,1:256,2:512,3:1024    */
  35. #define    _UM(x)    (((unsigned int)(x))&0x0ff)
  36. #define    RECNO(a,b,c,d)        ((_UM(a)<<24)|(_UM(b)<<16)|(_UM(c)<<8)|_UM(d))
  37.  
  38. int Swrite(int drive, int pos, int len, void* buff)
  39. {
  40.     unsigned int ret;
  41.     int side;
  42.     int track;
  43.     int sec;
  44.  
  45.     Null(buff);
  46.     drive <<= 8;
  47.     drive |= 0x70;        /* 倍密/Retryあり/Seekあり    */
  48.     side = (pos>>3)&1;
  49.     track = pos>>4;
  50.     sec = (pos&0x07)+1;
  51.     PR(("pos[%d] side[%d] track[%d] sec[%d]\n",pos,side,track,sec));
  52. /*    ret = B_SEEK(drive,RECNO(SECTOR_SIZE,track,side,sec));
  53.     if( (ret & 0x0ffffff00) == 0x0ffffff00 ){
  54.         printf("B_SEEK error [%08x]\n",ret);
  55.         return False;
  56.     }    */
  57.     ret = B_WRITE(drive,RECNO(SECTOR_SIZE,track,side,sec),len*1024,buff);
  58.     if( (ret & 0x0ffffff00) == 0x0ffffff00 ){
  59.         printf("B_WRITE error [%08x]\n",ret);
  60.         return False;
  61.     }
  62.     PR(("Normal end\n"));
  63.     return True;
  64. }
  65.  
  66. int MainLoop(char* fname, int drive)
  67. {
  68.     unsigned char program[1024];
  69.     unsigned int size;
  70.     unsigned int i;
  71.     FILE* fp;
  72.  
  73.     if( (fp=fopen(fname,"rb")) == NULL ){
  74.         printf("%s がオープン出来ません。\n",fname);
  75.         return False;
  76.     }
  77.     {
  78.         struct stat st;
  79.  
  80.         fstat(fileno(fp),&st);
  81.         size = st.st_size;
  82.     }
  83.     for(i=0;size;i++){
  84.         int len;
  85.  
  86.         if( size >= 1024 ){
  87.             len = 1024;
  88.             size -= 1024;
  89.         } else {
  90.             memset(program,0,1024);
  91.             len = size;
  92.             size = 0;
  93.         }
  94.         if( fread(program,len,1,fp) != 1 ){
  95.             fclose(fp);
  96.             printf("ファイルが読めませんでした。\n");
  97.             return False;
  98.         }
  99.         printf("write %4d",i);
  100.         if( Swrite(drive,i,1,program) == False ){
  101.             printf("ディスクに書けませんでした。\n");
  102.             return False;
  103.         }
  104.         printf("\r");
  105.     }    /* end of for    */
  106.     fclose(fp);
  107.     printf("\r書き込み完了\n");
  108.     return True;
  109. }
  110.  
  111. int main(int argc, char* argv[])
  112. {
  113.     char* fname = "ipl.r";
  114.     int drive = 0x90;
  115.     int i;
  116.  
  117.     allmem();
  118.     for(i=1;i<argc;i++){
  119.         char* p;
  120.         p = argv[i];
  121.         if( *p == '-' ){
  122.             p++;
  123.             if( *p == 'd'){
  124.                 p++;
  125.                 if( isdigit(*p) ){
  126.                     drive = atoi(p) + 0x90;
  127.                 } else
  128.                 if( i+1 < argc ){
  129.                     i++;
  130.                     drive = atoi(argv[i]) + 0x90;
  131.                 }
  132.             }
  133.         } else {
  134.             fname = p;
  135.         }
  136.     }    /* end of for    */
  137.     return (MainLoop(fname,drive)==True)?0:1;
  138. }
  139.